package org.smart4j.framework.proxy;

import java.lang.reflect.Method;
import java.util.List;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

/**
 * 代理管理器
 *
 */
public class ProxyManager {

    /**
     * 创建代理类对象
     * @param targetClass 目标类
     * @param proxyList 目标类的代理对象集合
     * @param <T> 目标类
     * @return
     */
    public static <T> T createProxy(final Class<?> targetClass, final List<Proxy> proxyList) {
        return (T) Enhancer.create(targetClass, new MethodInterceptor() {
            /**
             * 重写MethodInterceptor的intercept方法
             * 注意这个地方是具体执行时候的逻辑，也就是代理类的执行逻辑
             * 是用来获取代理对象的执行结果的，而不是通过这个类来生成代理对象的，
             * 【代理对象是通过Enhancer.create来生成】的，这个方法只是在代理类对象运行期间被调用的
             * @param targetObject
             * @param targetMethod
             * @param methodParams
             * @param methodProxy
             * @return
             * @throws Throwable
             */
            @Override
            public Object intercept(Object targetObject, Method targetMethod, Object[] methodParams, MethodProxy methodProxy) throws Throwable {
                return new ProxyChain(targetClass, targetObject, targetMethod, methodProxy, methodParams, proxyList).doProxyChain();
            }
        });
    }
}